package nexus.align
{
	import nexus.definition.Align;
	
	
	/**
	 * IA 경로   : common - winnie - align <br>
	 * 설명         : 정렬용 HBox <br>
	 * 최초 작성  : 김정환D - Xprime <br> 
	 * 수정         : <br>  
	 */
	public class AlignVBox extends BaseAlignBox
	{
		
		public function AlignVBox( __cellNum : int = 0, __minCellSize :Array = null, __alignList :Array = null )
		{
			super( __cellNum , __minCellSize, __alignList );
		}
		
		/**
		 * VBox 세로정렬 
		 */		
		override public function workingAlign():void
		{
			var len : int = this._itemList.length;
			var cellSum : Number = this.y;
			
			for( var i:int = 0; i<len; i++ )
			{
				var item : Object = ( this._itemList[ i ].item != null )?this._itemList[ i ].item:this._itemList[ i ].box;
				var info : AlignInfo = this._itemList[ i ].info;
				
				// 정렬 선택 안되어있거나 ( 디폴트 위쪽 ) , 선택이 위쪽이거나, 셀높이 지정을 안한경우
				// 무조건 위쪽정렬을 한다. 
				if( _alignList.length <= i || _alignList[ i ] == Align.TOP )
				{
					item.y = info.paddingTop + cellSum;
				}
				else
				{
					// 패딩 아래쪽은 오직 셀 안에서만 적용됨.
					item.y = cellSum + _minCellSize[ i ] - info.paddingBottom - item.height;
				}
				
				item.x = this.x + info.paddingLeft;
				
				if( item is BaseAlignBox ) item.workingAlign();
				
				// 만약 셀 기본높이 설정 안되어 있으면 기본으로 ( 아이템 높이 + 패딩 ) 을 정렬에 포함시킴
				cellSum += _minCellSize[ i ];
			}
		}
		
		
		
		/**
		 * @param list : box 타입이 아닌 DisplayObject 타입을 담은 list 를 넣는다.
		 */		
		public function addSimpleItems( list:Array ):AlignVBox
		{
			var len : int = list.length;
			for( var i:int = 0; i<len; i++ )
			{
				addItem( new AlignObject( list[ i ] ) );
			}
			
			return this;
		}
		
		
		/**
		 * @param item AlignObject
		 */		
		public function add( item:Object, padding : Array = null ):AlignVBox
		{
			if( padding == null ) padding = [0,0,0,0];
			addCell( item.height + padding[0] + padding[2] );
			_itemList.fixed = false;
			_itemList.push( new AlignObject( item , null, new AlignInfo( padding ) ) );
			_itemList.fixed = true;
			
			return this;
		}
		
		
		
		/**
		 * @param _cellSize 셀 1칸만 늘릴경우, 값이 없으면 defaultCellSize로 등록된다.
		 * @return AlignFactory
		 */		
		public function addCell( _cellSize : Number=0 ):void
		{
			minCellSize.push( _cellSize );
			cellNum++;
		}
		
		
		/**
		 * @return  heightMeasured : heightCellTotal 중에 큰것 반환
		 */		
		override public function get height():Number
		{
			return Math.max( cellTotalSize , heightMeasured );
		}
		
		/**
		 * VBox 제거
		 */		
		override public function destory():void
		{
			_cellNum = NaN;
			
			var len : int = _minCellSize.length;
			for( var i:int = 0; i<len; i++ )
			{
				delete _minCellSize.shift();
			}
			
			_minCellSize = null;
			
			len = _alignList.length;
			for( i=0; i<len; i++ )
			{
				delete _alignList.shift();
			}
			
			_alignList = null;
		}
		
	}
}